package fr.afcepf.atod16.groupe1.projet1.dao.commande;

import fr.afcepf.atod16.groupe1.projet1.dao.DaoAbstract;
import fr.afcepf.atod16.groupe1.projet1.dao.DaoAssembleur;
import fr.afcepf.atod16.groupe1.projet1.dto.commande.DtoCommande;
import fr.afcepf.atod16.groupe1.projet1.dto.commande.DtoLigneCommande;
import fr.afcepf.atod16.groupe1.projet1.entities.catalogue.Produit;
import fr.afcepf.atod16.groupe1.projet1.entities.commande.Commande;
import fr.afcepf.atod16.groupe1.projet1.entities.commande.LigneCommande;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceException;
import javax.persistence.TransactionRequiredException;

/**
 * Implementation de la DAO commande avec JPA
 * @author cedric
 */
@Stateless
public class DaoCommandeJpa extends DaoAbstract<Commande, DtoCommande> implements DaoCommande {

    @PersistenceContext(unitName = "projet1c-ejbPU")
    private EntityManager em;

    /**
     * Surcharge la fonction de récupération de l'entityManager car le contexte
     * de persistance est injecté dans la classe.
     * @return L'entityManager
     */
    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    /**
     * Constructeur fournissant à la superclasse l'objet Class de l'entité
     */
    public DaoCommandeJpa() {
        super(Commande.class);
    }

    /**
     * {@inheritDoc} 
     */
    @Override
    public List<DtoCommande> rechercherParNom(String nom) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     * {@inheritDoc} 
     */
    @Override
    public Integer ajouter(DtoCommande dto) {
              Integer id = null;
        try {
            Commande entity = DaoAssembleur.createEntity(dto);
            getEntityManager().persist(entity);
            getEntityManager().flush();
            id = entity.getId();
            
            Produit produitEntite;
            LigneCommande ligneEntite;
            for (DtoLigneCommande ligne : dto.getLignes()) {
                // la référence vers le produit
                produitEntite = DaoAssembleur.createEntity(ligne.getProduit());
                
                ligneEntite = DaoAssembleur.createEntity(ligne);
                ligneEntite.setCommande(entity);
                ligneEntite.setProduit(produitEntite);
                // persist lignes commande
                getEntityManager().persist(ligneEntite);
                
                // mettre à jour stock produit
                
            }
        } catch (EntityExistsException e) {
            System.out.println("l'entité existe déja");
        } catch (TransactionRequiredException e) {
            System.out.println("ou est la transaction ?");
        } catch (PersistenceException e) {
            System.out.println("le flush a echoué");
        } catch (IllegalArgumentException e) {
            System.out.println("donnez moi une entité !");
        }
        return id;
    }
    
    
}
